package java.classe;

import java.AssinaturaMetodo;
import java.pacote.Pacote;
import java.recurso.Recurso;
import java.util.ArrayList;




public class Interface implements TokensSource {
	Pacote pacote = null;

	ListaInterface qualidades = null;

	String modificador = null;

	boolean abstrata = false;

	ListaRecurso recursos = null;

	ListaAssinaturaMetodo assinaturas = null;

	String nome = null;

	public Interface(String nome) {
		this.nome = nome;
	}

	public String codigoFonte() {
		String pacote = this.pacote == null ? NONVALUE : this.pacote
				.codigoFonte()
				+ FIMCOMANDO + ESPACO;
		String abstrata = this.abstrata ? ABSTRACT + ESPACO : NONVALUE;
		String modificador = this.modificador == null ? NONVALUE
				: this.modificador + ESPACO;

		String recurso = this.recursos == null ? NONVALUE : recursos
				.codigoFonte();
		String assinaturas = this.assinaturas == null ? NONVALUE
				: this.assinaturas.codigoFonte();

		String qualidades = this.qualidades == null ? NONVALUE : ESPACO
				+ IMPLEMENTACAO + ESPACO + this.qualidades.codigoFonte();

		return pacote + recurso + modificador + abstrata + INTERFACE + ESPACO
				+ nome + qualidades + INICIOBLOCO + assinaturas + FIMBLOCO;
	}

	public Pacote getPacote() {
		return this.pacote;
	}

	public void setPacote(Pacote pacote) {
		this.pacote = pacote;
	}

	public String getNome() {
		return this.nome;
	}

	public void setAbstrata(boolean abstrata) {
		this.abstrata = abstrata;
	}

	public void setModificador(String modificador) {
		this.modificador = modificador;

	}

	public void addRecurso(Recurso recurso) {
		recursos = recursos == null ? new ListaRecurso() : recursos;
		recursos.add(recurso);
	}

	class ListaRecurso extends ArrayList<Recurso> {
		private static final long serialVersionUID = 710306713434101002L;

		String codigoFonte() {
			String s = NONVALUE;
			for (Recurso r : this) {
				s += r.codigoFonte() + FIMCOMANDO;
			}
			return s;
		}
	}

	class ListaAssinaturaMetodo extends ArrayList<AssinaturaMetodo> {
		private static final long serialVersionUID = 710306713432201002L;

		String codigoFonte() {
			String s = NONVALUE;
			for (AssinaturaMetodo r : this) {
				s += r.codigoFonte() + FIMCOMANDO;
			}
			return s;
		}
	}

	class ListaInterface extends ArrayList<Interface> {
		private static final long serialVersionUID = 144467222201002L;

		String codigoFonte() {
			String s = get(0).getNome();
			for (int i = 1; i < size(); i++) {
				s += VIRGULA + ESPACO + get(i).getNome();

			}
			return s;
		}
	}

	public void addAssinaturaMetodo(AssinaturaMetodo metodo) {
		assinaturas = assinaturas == null ? new ListaAssinaturaMetodo()
				: assinaturas;
		assinaturas.add(metodo);

	}

	public void addImplementar(Interface qualidade) {
		qualidades = qualidades == null ? new ListaInterface() : qualidades;
		qualidades.add(qualidade);
	}
}
